package com.code;

public class AnimalTest {

	public static void main(String[] args) {
		Animal animal = new Person1();//向上造型
		//调用子类重写后的方法
		animal.eat();
		//打印实例变量a，父类中a=1,Person中a=2,Pig中a=3
		System.out.println(animal.a);
		
		//调用子类特有方法
//		person.playBird();//多态的时候，不能调用子类特有方法
		
		animal = new Pig();//向上造型,父类变量重新指向新的子类对象
		//调用子类重写后的方法
		animal.eat();
		//打印实例变量a，父类中a=1,Person中a=2,Pig中a=3
		System.out.println(animal.a);
		
		
		/*
		 * 调用子类特有方法
		 * 	需要向下造型，向下造型需要进行类型判断：
		 * 		类型判断方式1：最常用
	 * 				if(父类变量 instanceof 子类类型1){
	 * 					//强制类型转换
	 * 					子类类型1 	子类变量 = (子类类型1)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}else if(父类变量 instanceof 子类类型2){
	 * 					//强制类型转换
	 * 					子类类型2 	子类变量 = (子类类型2)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}...
	 * 
	 * 				类型判断方式2：不常用
	 * 				if(父类变量.getClass() == 子类类型1.class){
	 * 					//强制类型转换
	 * 					子类类型1 	子类变量 = (子类类型1)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}else if(父类变量.getClass() == 子类类型2.class){
	 * 					//强制类型转换
	 * 					子类类型2 	子类变量 = (子类类型2)父类变量;
	 * 					//现在就可以调用子类特有方法
	 * 					子类变量.子类特有方法(...);
	 * 				}...
		 */
//		Person person = (Person)animal;//ClassCastException类造型异常。因为没有进行类型判断
		
		if (animal instanceof Person1) {//判断animal中是不是装的Person类型的子类对象，如果是强制转换
			//强制类型转换：子类类型1 	子类变量 = (子类类型1)父类变量;
			Person1 person = (Person1)animal;
			//调用特有方法
			person.playBird();
		} else if (animal instanceof Pig) {//判断animal中是不是装的Person类型的子类对象，如果是强制转换
			//强制类型转换：子类类型1 	子类变量 = (子类类型1)父类变量;
			Pig person = (Pig)animal;
			//调用特有方法
			person.gongBaiCai();
		}
		
		
	}

}
